<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>原型</title>
    <script>
        /*
        原型prototype
        我们所创建的每一个函数，解析器都会向函数中添加一个prototype属性
        它是一个指针,指向一个对象,这个对象包含了所有实例共享的属性和方法.
        这个对象就是我们所谓的原型对象   prototype->原型对象
        _proto_：
        当函数以构造函数的形式调用时，它所创建的对象（通过new创建）都会有一个隐含的属性，指向该构造函数的原型对象
        可以通过_proto_来访问该属性

        prototype与__proto__的联系:
        prototype与__proto__都指向原型对象,
        任意一个函数(包括构造函数)都有一个prototype属性,指向该函数的原型对象;
        任意一个构造函数实例化的对象,都有一个__proto__对象,它指向构造函数的原型对象.
         PS:构造函数也有__proto__对象指向它的父对象
         当我们访问对象的一个属性或方法时，它会先在对象自身中寻找，如果有则直接使用，如果没有则会去原型对象中寻找
         */
          function Person(name,age,gender){
              this.name=name;
              this.age=age;
              this.gender=gender;
          }
          Person.prototype.sayName=function (){
              alert("Hello"+this.name);
          }
          var per=new Person("孙悟空",18,"男");
          per.sayName();
          /*使用in检查对象中是否含有某个属性时，如果对象中没有，原型中有，也会返回true
          /可以使用对象的hasOwnProperty()来检查自身中是否含有该属性

          原型对象也是对象，也有原型对象
          当我们使用一个对象的属性或方法时，会先在自身寻找->原型对象中寻找->原型对象的原型中找....
          object对象的原型没有原型，如果object中没有找到，则返回undefined。
           */
    </script>
</head>
<body>

</body>
</html>